package elm.controller;

import elm.dao.BusinessDao;
import elm.entity.po.Business;
import elm.service.BusinessService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;

// 使用 OpenAPI 3 的注解包
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;

/**
 * 商家信息管理控制器
 * 提供商家数据的查询接口，包括：
 * - 查询所有商家列表
 * - 根据ID查询商家信息（含关联食品）
 * - 获取单个商家详细信息（含关联食品）
 */
@RestController
@RequestMapping("/business")
@Tag(name = "商家信息管理接口")
public class BusinessController {
    @Resource
    private BusinessDao businessDao;
    @Resource
    private BusinessService businessService;

    /**
     * 获取所有商家列表
     *
     * @return 包含所有商家信息的可迭代对象
     * 接口示例：/business/all
     * 返回值说明：返回Iterable<Business>类型，包含数据库中所有商家记录
     * 日志输出：打印返回的商家列表内容到控制台
     */
    @GetMapping("/all")
    @Operation(summary = "获取所有商家列表")
    public Iterable<Business> getAll() {
        Iterable<Business> businesses = businessDao.findAll();
        System.out.println("返回的商家列表: " + businesses); // 打印返回的数据
        return businesses;
    }

    /**
     * 根据ID获取商家列表
     * 当id=0时返回全部商家，其他情况返回空集合
     *
     * @param id 请求参数，商家列表唯一标识符
     * @return 符合条件的商家集合
     * 接口示例：/business/?id=123 或 /business/?id=0（获取全部）
     * 注意事项：仅当id为0时返回完整列表，其他情况均返回空集合
     */
    @GetMapping("/")
    @Operation(summary = "根据ID获取商家列表")
    public Iterable<Business> getBusinessListById(
            @Parameter(name = "id", description = "商家类型唯一标识符", required = true, example = "2")
            @RequestParam("id") Long id) {
       return businessService.getBusinessListByTypeId(id);
    }

    /**
     * 获取商家详细信息（包含关联食品信息）
     * 使用Eager Fetching一次性加载商家及其关联食品数据
     *
     * @param id 请求参数，商家唯一标识符
     * @return 包含商家及其食品信息的实体对象
     * 接口示例：/business/info?id=123
     * 数据加载：通过findByIdWithFoods方法实现关联数据预加载
     * 日志输出：打印查询结果到控制台
     */
    @GetMapping("/info")
    @Operation(summary = "获取商家详细信息（包含关联食品）")
    public Business getBusinessInfoDetail(
            @Parameter(name = "id", description = "商家唯一标识符", required = true, example = "123")
            @RequestParam("id") Long id) {
        Business business = businessDao.findByIdWithFoods(id);
        System.out.println(business);
        return business;
    }

    /**
     * 模糊搜索商家
     *
     * @param keyword 搜索关键词
     * @return 返回匹配的商家列表
     */
    @GetMapping("/search")
    public Iterable<Business> searchBusinesses(
            @RequestParam("keyword")
            @Parameter(name = "keyword", description = "搜索关键词", required = true)
            String keyword
    ) {
        return businessService.searchBusinessesByKeyword(keyword);
    }
}
